package cn.itcast.bos.web.action.common;



import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

import org.apache.poi.ss.formula.functions.T;
import org.springframework.data.domain.Page;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

@SuppressWarnings({ "serial", "hiding" })
public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>{
    //模型驱动
	protected T model;
	
	@Override
	public T getModel() {
		return model;
	}

	@SuppressWarnings({ "unchecked" })
	public BaseAction(){   //通过构造器实现model的实例化 给model赋值  把BaseAction 做为抽象类 不能new  构造子类对象
		// 构造子类action对象 继承父类型的泛型   this.getClass 得到的是子类的得到的BaseAction<area> 得到带有泛型的类型
		//this代表new的是谁指的就是谁
		Type genericSuperclass = this.getClass().getGenericSuperclass();
		//转换成参数化类型
		ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
		//用参数化类型调用getActualTypeArguments   得到所有的参数 得到的就是 BaseAction<area>  获取类型第一个泛型参数  
		Class<T> modelClass = (Class<T>) parameterizedType.getActualTypeArguments()[0];
		try {
			//实现自动实例化
			model = modelClass.newInstance();
		} catch (InstantiationException | IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("模型构造失败.....");
		}
	}
	
	
	
		//接收分页查询
	   protected Integer page;
	   protected Integer rows;
	   
	   
	   
	   
	   public void setPage(Integer page) {
			this.page = page;
		}

		
		public void setRows(Integer rows) {
			this.rows = rows;
		}
	
		protected void pushPageDataToValueStack(Page<T> pageDate){
		Map<String,Object> map = new HashMap<>();		
		map.put("total",pageDate.getTotalElements());
		map.put("rows", pageDate.getContent());
		//压入到值栈
		ActionContext.getContext().getValueStack().push(map);
	}

}
